今天來仔細了解一下昨天到底是怎麼設定 Discord BOT 的。
今天會簡單地認識怎麼設定 Discord BOT 的執行腳本 (以 Quickstart 範例程式為例)。
昨天我們只有直接執行範例程式,今天讓我們來重新看一下這段程式。
# day03.py
import discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
client.run('your token here')
可以大致上把這段程式分成三個階段:
import discord
+ intents = discord.Intents.default()
+ intents.message_content = True
+
+ client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
client.run('your token here')
先前有提過,Discord BOT 其實就跟一般用戶一樣,因此,我們需要建立一個 Client
物件。建立時,有一個必要參數 intents
(意思是「意圖」),只有那些有被宣告的「意圖」項目才能在後面使用,相當於控制了這個 Client
物件的權限。
intents
是一個很重要的參數,如果沒有設定好,那麼程式是不會照預期的運作的。舉例來說,如果我們把 intents.message_content = True
這行註解掉 (即「不宣告有讀取訊息的意圖」),執行上面這個 quickstart 時,Discord BOT 是沒辦法對我們發出的訊息做出回應的,同時,程式碼也不會報錯。
intents
的細節明天再仔細說明
import discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
+ @client.event
+ async def on_ready():
+ print(f'We have logged in as {client.user}')
+
+ @client.event
+ async def on_message(message):
+ if message.author == client.user:
+ return
+
+ if message.content.startswith('$hello'):
+ await message.channel.send('Hello!')
client.run('your token here')
這部分就是在設定這個 Client
的執行腳本,包含:
We have logged in as 鐵人賽bot#0945
$hello
,就回傳 Hello
其中,為了避免 Discord BOT 回應的訊息又再度觸發腳本,強烈建議要加入判斷,如果發送訊息的 Discord BOT 本身就不予回應。
這邊只是很簡單的兩個小腳本,之後會再仔細介紹各種觸發條件與各種回應的方式。
import discord
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'We have logged in as {client.user}')
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('Hello!')
+ client.run('your token here')
最後,就是使用 Token 來啟用 Client
,讓 Discord BOT 上線。
看完官網上的版本,來看看 Github 上的版本,感受一下不同的寫法。
import discord
class MyClient(discord.Client):
async def on_ready(self):
print('Logged on as', self.user)
async def on_message(self, message):
# don't respond to ourselves
if message.author == self.user:
return
if message.content == 'ping':
await message.channel.send('pong')
intents = discord.Intents.default()
intents.message_content = True
client = MyClient(intents=intents)
client.run('token')
與 Discord BOT 互動:
這個寫法我覺得比較漂亮,它建立了一個新 class MyClient
(繼承了 Client
),然後把所有腳本都整理在 MyClient
這個 Class 中。如此一來,如果之後有需要,就可以把 MyClient
拆去其他檔案進行管理。
import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='>', intents=intents)
@bot.command()
async def ping(ctx):
await ctx.send('pong')
bot.run('token')
與 Discord BOT 互動:
這個寫法更簡潔,不過它有使用到 discord.py 的 Extension,細節等之後再介紹。
Github 上有一個 examples 資料夾 (連結),裡面有非常多範例,不過都是比較進階一點的功能,各位新手朋友可以等熟悉 discord.py 後再來觀摩。
今天我們回顧了昨天的 Quickstart 範例程式,了解它到底做了哪些事。明天就會開始仔細介紹比較進階的內容了~